""" рабочий вариант drag text"""
import sys
import logging                                                                  # запись логов

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class Label(QLabel):

    def __init__(self, parent=None):
        super().__init__()
        
    def mousePressEvent(self, pe):
        """ Запоминаются координаты щелчка левой кнопкой мыши"""
        if pe.button() == Qt.LeftButton:
            self.m_ptDragPos = pe.pos()
        QWidget.mousePressEvent(self, pe) # посылаем сигнал дальше
            
    def mouseMoveEvent(self, pe):
        """Метод  mouseMoveEvent() нужен для распознавания начала перетаскивания. 
        Это сделано потому, что нажатие левой кнопки мыши и последующее 
        перемещение указателя не всегда говорит о желании пользователя перетащить 
        объект, т. к. у пользователя могла просто дрогнуть рука, случайно 
        переместив указатель мыши. Чтобы быть уверенным, необходимо вычислить 
        расстояние между текущей позицией и той позицией, в которой была нажата 
        левая кнопка мыши. Если это расстояние превышает величину, возвращаемую 
        статическим методом  startDragDistance() (обычно 4 пиксела), то можно 
        считать, что перемещение указателя мыши было неслучайным и пользователь 
        действительно хочет перетащить выбранный объект."""
        """ Вычисляем Манхэттенское расстояние. Если прошли больше чем некая 
        величина, то начата операция drag and drop """
        if (pe.buttons() == Qt.LeftButton):
            distance = (pe.pos() - self.m_ptDragPos).manhattanLength()
            if (distance > QApplication.startDragDistance()):
                self.startDrag()
        QWidget.mousePressEvent(self, pe)

    def startDrag(self):  
        """Затем вызывается метод  startDrag() . В этом методе создается объект 
        класса  QMimeData, в который, вызовом метода  setText() , передается 
        перетаскиваемый текст. Затем создается объект перетаскивания класса  
        QDrag , в конструктор которого передается указатель на виджет, из 
        которого осуществляется перетаскивание."""    
        url = QUrl.fromLocalFile("c:\\tmp\\1.txt");
        print(url)
        # url = list(url)
        mimeData = QMimeData()
        mimeData.setUrls([url])  # setUrls ( [QtCore.QUrl ( "http: //google. ru/")])
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        """Вызов метода  setPixmap() устанавливает небольшое растровое 
        изображение, перемещаемое вместе с указателем мыши при перетаскивании."""
        drag.setPixmap(QPixmap('add.png')) 
        """Метод  exec() запускает операцию перетаскивания. В этот метод можно 
        также передавать значения, влияющие на внешний вид пиктограммы, 
        находящейся рядом с курсором мыши и поясняющей смысл действия 
        перетаскивания. Например, для копирования это значение  Qt::CopyAction, 
        для перемещения — Qt::MoveAction , для создания ссылки —  Qt::LinkAction. 
        По умолчанию это значение устанавливается равным  Qt::MoveAction """
        drag.exec_(Qt.MoveAction)

        # drag = QDrag(self)
        # mimeData = QMimeData()
        # mimeData.setText("c:\tmp\1.txt")
        # # mimeData.setUrls("c:\tmp\1.txt")
        # drag.setMimeData(mimeData)
        # drag.setPixmap(QPixmap('add.png')) 
        # drag.exec_(Qt.CopyAction)
            
if __name__ == '__main__':                                                      

    app = QApplication(sys.argv)
    label = Label()
    label.setText("foo bar");
    label.show();
    sys.exit(app.exec_())                                                       # Запускаем цикл обработки событий
